package com.yuchuang.utils;

import com.yuchuang.base.PageInfo;
import com.yuchuang.base.Result;
import com.yuchuang.mapper.UserMapper;
import com.yuchuang.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 *@authoe    :cy
 *@date      :16:40 2023-04-24
 *description: 封装分页page  通用
 *
 * 我们经常会通过@Autowired注解将某个类注到另一个类中，但是会发现注不进去，报NULL。
 *
 * 可能的原因有一下几种：
 *
 * （1）该类没有托管给spring 管理
 *
 * 一般在类的上面添加@Component 就可以了
 *
 * （2）你的这个类有被new出来的实例的，new 过的对象不会交给Spring容器管理 所以里面的 service或者dao注入不进来。
 * 一般是指引用某些框架，你是继承某个接口，但是这些框架默认new过这个方法，比如MVC拦截的HandlerInterceptor类。
 *
 * 如果要new的这个类里有想用@autowired 自动注入的内容，则最好不要去new这个类，否则自动注入无效，为null;
 *
 * 解决方法   用静态方法    calss类名直接点静态方法  解决
 *return     :
**/
//@Component
public class UtilPageInfo {
    @Autowired
    private UserService userService ;
    @Autowired
    private UserMapper userMapper ;

    private static UtilPageInfo utilPageInfo;

    /**
     *@authoe    :cy
     *@date      :16:41 2023-04-24
     *description:init  初始化 防止userMapper为null指针
     *return     : @PostConstruct 该类是运行时调用，且目标为方法级别。所以该注解只能作用在方法上
    **/
    public UtilPageInfo() {
        utilPageInfo = this;
        utilPageInfo.userService = this.userService;
        utilPageInfo.userMapper = this.userMapper;
//        System.out.println("构造函数22222222222222222222222");
    }
//    @PostConstruct
//    public void init(){
//        utilPageInfo = this;
//        utilPageInfo.userService = this.userService;
//        utilPageInfo.userMapper = this.userMapper;
//        utilPageInfo.ownerService = this.ownerService;
//        utilPageInfo.ownerMapper = this.ownerMapper;
//        utilPageInfo.houseTypeService = this.houseTypeService;
//        utilPageInfo.houseTypeMapper = this.houseTypeMapper;
//        System.out.println("================优先执行");
//    }
    /**
     *@authoe    :cy
     *@date      :16:42 2023-04-24
     *description:参数验证 是否存在key  以及value值
     *return     :
    **/
    public static Boolean isVerify(Map<String,Object> params,String filed){
//        System.out.println("验证 前端传过来的map参数"+params);
        if(!params.containsKey(filed) || params.get(filed) == null){
            return false;
        }else{
            if(params.get(filed) instanceof String){
                params.put(filed,Integer.parseInt(params.get(filed).toString()));
            }
            return true;
        }
    }
    /**
     *@authoe    :cy
     *@date      :16:43 2023-04-24
     *description:参数异常  返回提示给前端
     *return     :
    **/
    public static Result reVerify(String filed){
        return Result.fail(filed+"为空");
    }
    /**
     *@authoe    :cy
     *@date      :16:43 2023-04-24
     *description: 通用分页提取   参数  map   service  mapper
     *return     :
    **/
    public static  PageInfo pageInfo(Map<String,Object> params, String service,String mapper){
        int page = Integer.parseInt(params.get("page").toString());
        int size = Integer.parseInt(params.get("size").toString());
        int current = ((page - 1) * size);
        params.put("PageSize",current);
        List list;
        int total = 0;
        switch (service){
            case "userService":
//                list = utilPageInfo.userService.query(params);
                list = new ArrayList();
                break;
            default:
                list = null;
                break;
        }
        switch (mapper){
            case "userMapper":
                total = utilPageInfo.userMapper.selectBatis();
                break;
            default:
                total = 0;
                break;
        }
        double ceil = ((double) total / size);//整数除以另一个整数会得到一个整数：15/10是1。
        int pages = total == 0 ? 0 : (int) Math.ceil(ceil);
        return PageInfo.page(list,page,size,total,pages);
    }
}
